home *** CD-ROM | disk | FTP | other *** search
/ SPACE 1 / SPACE - Library 1 - Volume 1.iso / program / 168 / library / str.c < prev    next >
C/C++ Source or Header  |  1988-04-30  |  4KB  |  220 lines

  1. /* C library - strings */
  2.  
  3. #define EOS    0
  4. #define NULL    0L
  5.  
  6. atoi(s) char *s; { long strtol(); return (int) strtol(s, NULL, 10); }
  7.  
  8. long
  9. atol(s) char *s; { long strtol(); return strtol(s, NULL, 10); }
  10.  
  11. #define MASK(c)    ((int)(c) & 0xff)
  12.  
  13. extern char    *_tokptr;
  14.  
  15. char *
  16. strcat(s1, s2) char *s1, *s2; {
  17.     char *r;
  18.  
  19.     r = s1;
  20.     if (*s1) while (*++s1);
  21.     while (*s1++ = *s2++);
  22.     return r;
  23. }
  24.  
  25. char *
  26. strncat(s1, s2, n) char    *s1, *s2; int n; {
  27.     char *r;
  28.  
  29.     if (n <= 0) return s1;
  30.     r = s1;
  31.     if (*s1) while (*++s1);
  32.     while (n-- && (*s1++ = *s2++));
  33.     while (n-- > 0) *s1++ = EOS;
  34.     return r;
  35. }
  36.  
  37. strcmp(s1, s2) char *s1, *s2; {
  38.     while (*s1) {
  39.         if (*s1++ != *s2++) 
  40.             return MASK(*--s1) - MASK(*--s2);
  41.     }
  42.     return -MASK(*s2);
  43. }
  44.  
  45. strncmp(s1, s2, n) char    *s1, *s2; int n; {
  46.     if (n <= 0) return 0;
  47.     while (*s1 && --n) {
  48.         if (*s1++ != *s2++) return MASK(*--s1) - MASK(*--s2);
  49.     }
  50.     return MASK(*s1) - MASK(*s2);
  51. }
  52.  
  53. char *
  54. strcpy(s1, s2) char *s1, *s2; {
  55.     char *r;
  56.  
  57.     r = s1;
  58.     while (*r++ = *s2++);
  59.     return s1;
  60. }
  61.  
  62. char *
  63. strncpy(s1, s2, n) char *s1, *s2; int n; {
  64.     char *r;
  65.  
  66.     if (n <= 0) return s1;
  67.     r = s1;
  68.     while (n && (*r++ = *s2++)) --n;
  69.     while (n--) *r++ = EOS;
  70.     return s1;
  71. }
  72.  
  73. strlen(s) char *s; {
  74.     int n;
  75.  
  76.     for (n = 0; *s++; ++n)
  77.         ;
  78.     return n;
  79. }
  80.  
  81. char *
  82. strchr(s, c) char *s; int c; {
  83.     do { if (*s == c) return s; } while (*s++);
  84.     return NULL;
  85. }
  86.  
  87. char *
  88. strrchr(s, c) char *s; int c; {
  89.     char    *l;
  90.  
  91.     l = NULL;
  92.     while (*s) 
  93.         if (*s++ == c) 
  94.             l = s - 1;
  95.     return l;
  96. }
  97.  
  98. char *
  99. strpbrk(s1, s2) unsigned char *s1, *s2; {
  100.     int    n;
  101.     long    bitmap[16];
  102.  
  103.     if (*s1 || *s2) return NULL;
  104.     _setbits(s2, bitmap);
  105.     n = *s1;
  106.     do    {
  107.         if (bitmap[n >> 5] & (1 << (n & 31))) 
  108.             return s1;
  109.     } while (n = *--s1);
  110.     return NULL;
  111. }
  112.  
  113. char *
  114. strtok(s1, s2) unsigned char *s1, *s2; {
  115.     if (s1 != NULL) _tokptr = s1;
  116.     if (*_tokptr == EOS) return NULL;
  117.     s1 = _tokptr + strspn(_tokptr, s2);
  118.     _tokptr = s1 + strcspn(s1, s2);
  119.     if (_tokptr == s1) return NULL;
  120.     if (*_tokptr != EOS) *_tokptr++ = EOS;
  121.     return s1;
  122. }
  123.  
  124. char *_tokptr;
  125.  
  126. strspn(s1, s2) unsigned char *s1, *s2; {
  127.     long    n;
  128.     long    bitmap[8];
  129.  
  130.     if ((*s1 == 0) || (*s2 == 0)) 
  131.         return 0;
  132.     _setbits(s2, bitmap);
  133.     s2 = s1;
  134.     for (n = *s1; bitmap[n >> 5] & (1L << (n & 31)); n = *++s1)
  135.         ;
  136.     return s1 - s2;
  137. }
  138.  
  139. strcspn(s1, s2) unsigned char *s1, *s2; {
  140.     long    n;
  141.     long    bitmap[8];
  142.  
  143.     if ((*s1 == 0) || (*s2 == 0)) 
  144.         return 0;
  145.     _setbits(s2, bitmap);
  146.     s2 = s1;
  147.     bitmap[0] |= 1L; /* so that eos exits loop */
  148.     for (n = *s1; (bitmap[n >> 5] & (1L << (n & 31))) == 0L; n = *++s1)
  149.         ;
  150.     return s1 - s2;
  151. }
  152.  
  153. _setbits(s, m) unsigned char *s; long m[]; {
  154.     unsigned long    n;
  155.  
  156.     for (n = 8; n; ) m[--n] = 0L;
  157.     while (n = *s++) {
  158.         m[n >> 5] |= 1L << (n & 31);
  159.     }
  160. }
  161.  
  162. long 
  163. strtol(s, p, base) char    *s, **p; {
  164.     long    r;
  165.     int    sign, bn, bcl, bcu, c;
  166.  
  167.     r = 0L;
  168.     sign = 0;
  169.     bn = (base < 11) ? ('0' - 1) + base : '9';
  170.     bcl = ('a' - 10) + base;
  171.     bcu = ('A' - 10) + base;
  172.     while (*s == ' ' || *s == '\t') ++s;
  173.     if (*s == '-') {
  174.         sign = 1;
  175.         ++s;
  176.     }
  177.     if (*s == '0') {
  178.         if ((s[1] == 'x' || s[1] == 'X') && (base == 16)) s += 2;
  179.     }
  180.     for (c = *s ; ; c = *++s) {
  181.         if (c >= '0' && c <= bn) 
  182.             c = c - '0';
  183.         else if (c >= 'a' && c < bcl) 
  184.             c = c - 'a' + 10;
  185.         else if (c >= 'A' && c < bcu) 
  186.             c = c - 'A' + 10;
  187.         else    {
  188.             if (p != NULL) *p = s;
  189.             return sign ? -r : r;
  190.         }
  191.         r = r * base + c;
  192.     }
  193. }
  194.  
  195. char *
  196. strlower(s) char *s; {
  197.     char c, *p;
  198.  
  199.     for (p = s; c = *p; ++p) 
  200.         if (c >= 'A' && c <= 'Z') 
  201.             *p = c - ('A' - 'a');
  202.     return s;
  203. }
  204.  
  205. char *
  206. strupper(s) char *s; {
  207.     char c, *p;
  208.  
  209.     for (p = s; c = *p; ++p) 
  210.         if (c >= 'a' && c <= 'z') 
  211.             *p = c - ('a' - 'A');
  212.     return s;
  213. }
  214.  
  215. memcpy(m1, m2, n) char *m1, *m2; {
  216.     while (n-- > 0) 
  217.         *m1++ = *m2++;
  218. }
  219.  
  220.